home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / adg_7_8.zip / SETUPINF.C < prev    next >
C/C++ Source or Header  |  1991-02-21  |  12KB  |  402 lines

  1. /****************************************************************************
  2. Module name: SetupInf.C
  3. Programmer : Jeffrey M. Richter.
  4. *****************************************************************************/
  5.  
  6. #include "..\nowindws.h"
  7. #undef NOCTLMGR
  8. #undef NOKERNEL
  9. #undef NOLFILEIO
  10. #undef NOLSTRING
  11. #undef NOMB
  12. #undef NOMEMMGR
  13. #undef NOMSG
  14. #undef NOOPENFILE
  15. #undef NOSHOWWINDOW
  16. #undef NOUSER
  17. #undef NOWINMESSAGES
  18. #undef NOWINOFFSETS
  19. #undef NOWINSTYLES
  20. #include <windows.h>
  21.  
  22. #include <string.h>
  23. #include <stdlib.h>
  24.  
  25. #include "Setup.H"
  26. #include "SetupInf.H"
  27.  
  28. #define MAXSETUPINFOSIZE   10240
  29.  
  30. struct {
  31.    char szAppName[MAXAPPNAME];
  32.    char szDefDir[MAXDIR];
  33.    WORD wSpaceNeeded;
  34.    char szPMGroupFileName[MAXFILENAME];
  35.    char szPMGroupName[MAXPMDESC];
  36.    WORD wNumDisks, wNumDirs, wNumFiles, wNumPMFiles;
  37. } SetupInfo;
  38.  
  39. struct {
  40.    WORD wNum;
  41.    char szDesc[MAXDISKDESC];
  42. } DiskInfo[10];
  43.  
  44. struct {
  45.    WORD wNum;
  46.    char szDesc[MAXDIRDESC];
  47. } DirInfo[25];
  48.  
  49. struct {
  50.    char szDesc[MAXFILEDESC];
  51.    char szFileName[MAXFILENAME];
  52.    WORD wDirNum, wDiskNum;
  53.    BOOL fCompressed;
  54. } FileInfo[200];
  55.  
  56. struct {
  57.    char szFileName[MAXFILENAME];
  58.    char szDesc[MAXPMDESC];
  59.    char szIconFileName[MAXFILENAME];
  60.    WORD wIconPos;
  61. } PMInfo[20];
  62.  
  63.  
  64. typedef enum {
  65.    RS_UNDEFINED,
  66.    RS_APPLICATION,
  67.    RS_DISKS,
  68.    RS_DIRS,
  69.    RS_FILES,
  70.    RS_PMINFO,
  71.    RS_TERMINATE
  72. } READSTATE;
  73.  
  74.  
  75. static WORD NEAR PASCAL latoi (LPSTR szString) {
  76.    WORD wNum = 0;
  77.    while (*szString >= '0' && *szString <= '9')
  78.       wNum = (wNum * 10) + (*szString++ - '0');
  79.    return(wNum);
  80. }
  81.  
  82. LPSTR NEAR PASCAL StripEndBlanks (LPSTR szString) {
  83.    LPSTR p = szString, q = szString;
  84.  
  85.    while (*p == ' ' || *p == '\t') p++;
  86.    while (*p) *szString++ = *p++;
  87.    *szString-- = 0; 
  88.    while (szString >= q && (*szString == ' ' || *szString == '\t'))
  89.       *szString-- = 0;
  90.    return(q);
  91. }
  92.  
  93. static int NEAR PASCAL PrepareSetupInfo (LPSTR szInfoFile) {
  94.    READSTATE State = RS_UNDEFINED;
  95.    WORD wResult = TRUE;
  96.    char szLine[100];
  97.    LPSTR p, szData;
  98.    HCURSOR hCursor;
  99.  
  100.    hCursor = SetCursor(LoadCursor(NULL, IDC_WAIT));
  101.    // Initialize application global information.
  102.    SetupInfo.szAppName[0] = 0;
  103.    SetupInfo.szDefDir[0] = 0;
  104.    SetupInfo.wSpaceNeeded = 0;
  105.    SetupInfo.szPMGroupFileName[0] = 0;
  106.    SetupInfo.szPMGroupName[0] = 0;
  107.    SetupInfo.wNumDisks = SetupInfo.wNumDirs = 0;
  108.    SetupInfo.wNumFiles = SetupInfo.wNumPMFiles = 0;
  109.  
  110.    while (State != RS_TERMINATE) {
  111.  
  112.       // Read next line from data buffer.
  113.       p = _fstrchr(szInfoFile, '\r');
  114.       if (p != NULL) *p = 0;
  115.       lstrcpy(szLine, szInfoFile);
  116.       if (p != NULL) szInfoFile = p + 2;
  117.  
  118.       // Remove leading white-space.
  119.       StripEndBlanks(szLine);
  120.  
  121.       // Check if the state has changed.
  122.       if (*szLine == '[') {
  123.          State = RS_UNDEFINED;
  124.  
  125.          if (lstrcmpi(szLine, "[End]") == 0)
  126.             State = RS_TERMINATE;
  127.          if (lstrcmpi(szLine, "[Application]") == 0)
  128.             State = RS_APPLICATION;
  129.          if (lstrcmpi(szLine, "[Disks]") == 0)
  130.             State = RS_DISKS;
  131.          if (lstrcmpi(szLine, "[Dirs]") == 0)
  132.             State = RS_DIRS;
  133.          if (lstrcmpi(szLine, "[Files]") == 0)
  134.             State = RS_FILES;
  135.          if (lstrcmpi(szLine, "[PM Info]") == 0)
  136.             State = RS_PMINFO;
  137.  
  138.          if (State == RS_UNDEFINED) {
  139.             // Unrecognized section in SETUP.INF file.
  140.          }
  141.          continue;
  142.       }
  143.  
  144.       // Line is part of the current state.
  145.       if (*szLine == ';') continue;
  146.       if (*szLine == 0) continue;
  147.  
  148.       if (State == RS_APPLICATION ||  State == RS_DISKS ||  State == RS_DIRS) {
  149.          szData = _fstrchr(szLine, '=');
  150.          if (szData != NULL) *szData++ = 0;
  151.       } else szData = szLine;
  152.  
  153.       StripEndBlanks(szLine);
  154.       if (szData != szLine) StripEndBlanks(szData);
  155.  
  156.       switch (State) {
  157.          case RS_APPLICATION:
  158.             if (lstrcmpi(szLine, "AppName") == 0)
  159.                lstrcpy(SetupInfo.szAppName, szData);
  160.  
  161.             if (lstrcmpi(szLine, "DefDir") == 0)
  162.                lstrcpy(SetupInfo.szDefDir, szData);
  163.  
  164.             if (lstrcmpi(szLine, "SpaceNeeded") == 0)
  165.                SetupInfo.wSpaceNeeded = latoi(szData);
  166.  
  167.             if (lstrcmpi(szLine, "DefPMGroup") == 0) {
  168.                p = _fstrchr(szData, ','); *p = 0;
  169.                lstrcpy(SetupInfo.szPMGroupFileName, StripEndBlanks(szData));
  170.                lstrcpy(SetupInfo.szPMGroupName, StripEndBlanks(p + 1));
  171.             }
  172.             break;
  173.  
  174.          case RS_DISKS:
  175.             DiskInfo[SetupInfo.wNumDisks].wNum = latoi(szLine);
  176.             lstrcpy(DiskInfo[SetupInfo.wNumDisks++].szDesc, szData);
  177.             break;
  178.  
  179.          case RS_DIRS:
  180.             DirInfo[SetupInfo.wNumDirs].wNum = latoi(szLine);
  181.             lstrcpy(DirInfo[SetupInfo.wNumDirs++].szDesc, szData);
  182.             break;
  183.  
  184.          case RS_FILES:
  185.             p = _fstrchr(szData, ','); *p++ = 0;
  186.             lstrcpy(FileInfo[SetupInfo.wNumFiles].szDesc,
  187.                StripEndBlanks(szData));
  188.  
  189.             szData = p; p = _fstrchr(szData, ','); *p++ = 0;
  190.             lstrcpy(FileInfo[SetupInfo.wNumFiles].szFileName,
  191.                StripEndBlanks(szData));
  192.  
  193.             szData = p; p = _fstrchr(szData, ','); *p++ = 0;
  194.             FileInfo[SetupInfo.wNumFiles].wDirNum =
  195.                latoi(StripEndBlanks(szData));
  196.  
  197.             szData = p; p = _fstrchr(szData, ','); *p++ = 0;
  198.             FileInfo[SetupInfo.wNumFiles].wDiskNum =
  199.                latoi(StripEndBlanks(szData));
  200.  
  201.             StripEndBlanks(p);
  202.             FileInfo[SetupInfo.wNumFiles++].fCompressed =
  203.                (*p == 'Y' || *p == 'y');
  204.             break;
  205.  
  206.  
  207.          case RS_PMINFO:
  208.             p = _fstrchr(szData, ','); *p++ = 0;
  209.             lstrcpy(PMInfo[SetupInfo.wNumPMFiles].szFileName,
  210.                StripEndBlanks(szData));
  211.             szData = p; p = _fstrchr(szData, ',');
  212.             if (p != NULL) *p++ = 0;
  213.             lstrcpy(PMInfo[SetupInfo.wNumPMFiles].szDesc,
  214.                StripEndBlanks(szData));
  215.  
  216.             if (p == NULL) {
  217.                PMInfo[SetupInfo.wNumPMFiles].szIconFileName[0] = 0;
  218.                PMInfo[SetupInfo.wNumPMFiles].wIconPos = 0;
  219.             } else {
  220.                szData = p; p = _fstrchr(szData, ',');
  221.                if (p != NULL) *p++ = 0;
  222.  
  223.                lstrcpy(PMInfo[SetupInfo.wNumPMFiles].szIconFileName,
  224.                   StripEndBlanks(szData));
  225.                PMInfo[SetupInfo.wNumPMFiles].wIconPos =
  226.                   latoi(StripEndBlanks(p));
  227.             }
  228.             SetupInfo.wNumPMFiles++;
  229.             break;
  230.       }
  231.    }
  232.    SetCursor(hCursor);
  233.    return(wResult);
  234. }
  235.  
  236. DWORD FAR PASCAL SetupInfoSys (SETUPINFOMSG Msg, WORD wParam, LPSTR lpBuffer) {
  237.    DWORD dwResult = 0; GLOBALHANDLE hMem; int nFile; OFSTRUCT of;
  238.    LPSTR p; WORD x;
  239.  
  240.    switch (Msg) {
  241.       case SIM_INITIALIZE:
  242.          // wParam = NU, lpBuffer = pathname.
  243.          dwResult = SIM_INIT_NOERROR;
  244.          hMem = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, MAXSETUPINFOSIZE);
  245.          if (hMem == NULL) {
  246.             dwResult = SIM_INIT_NOMEM;
  247.             break;
  248.          }
  249.          nFile = OpenFile(lpBuffer, &of, OF_READ);
  250.          if (nFile == -1) {
  251.             dwResult = SIM_INIT_NOFILE;
  252.             break;
  253.          }
  254.          p = GlobalLock(hMem);
  255.          // Put a terminating zero byte at the end of the buffer.
  256.          *(p + _lread(nFile, p, MAXSETUPINFOSIZE)) = 0;
  257.          _lclose(nFile);
  258.          PrepareSetupInfo(p);
  259.          GlobalUnlock(hMem); GlobalFree(hMem);
  260.          break;
  261.  
  262.       case SIM_GETAPPNAME:
  263.          // wParam: NU, lpBuffer: to buffer.
  264.          lstrcpy(lpBuffer, SetupInfo.szAppName);
  265.          break;
  266.  
  267.       case SIM_GETDEFDIR:
  268.          // wParam: NU, lpBuffer: to buffer.
  269.          lstrcpy(lpBuffer, SetupInfo.szDefDir);
  270.          break;
  271.  
  272.       case SIM_GETSPACENEEDED:
  273.          // wParam = NU, lpBuffer = NU.
  274.          dwResult = SetupInfo.wSpaceNeeded;
  275.          break;
  276.  
  277.       case SIM_GETNUMDISKS:
  278.          // wParam: NU, lpBuffer = NU.
  279.          dwResult = SetupInfo.wNumDisks;
  280.          break;
  281.  
  282.       case SIM_GETDISKDESC:
  283.          // wParam: Disk #, lpBuffer: LPSTR.
  284.          lstrcpy(lpBuffer, DiskInfo[wParam].szDesc);
  285.          break;
  286.  
  287.       case SIM_FINDDISKNUM:
  288.          // wParam: Dir#, lpBuffer: NU.
  289.          dwResult = SetupInfoSys(SIM_GETNUMDISKS, 0, 0);
  290.          while (dwResult--)
  291.                 if (wParam == DiskInfo[(WORD) dwResult].wNum) break;
  292.          break;
  293.  
  294.  
  295.       case SIM_GETNUMDIRS:
  296.          // wParam: NU, lpBuffer: NU.
  297.          dwResult = SetupInfo.wNumDirs;
  298.          break;
  299.  
  300.       case SIM_GETDIR:
  301.          // wParam: Dir#, lpBuffer = to buffer.
  302.          lstrcpy(lpBuffer, DirInfo[wParam].szDesc);
  303.          break;
  304.  
  305.       case SIM_FINDDIRNUM:
  306.          // wParam: Dir#, lpBuffer: NU.
  307.          dwResult = SetupInfoSys(SIM_GETNUMDIRS, 0, 0);
  308.          while (dwResult--)
  309.                 if (wParam == DirInfo[(WORD) dwResult].wNum) break;
  310.          break;
  311.  
  312.  
  313.       case SIM_GETNUMFILES:
  314.          // wParam: NU, lpBuffer: NU.
  315.          dwResult = SetupInfo.wNumFiles;
  316.          break;
  317.  
  318.       case SIM_GETFILEDESC:
  319.          // wParam: File#, lpBuffer: to buffer.
  320.          lstrcpy(lpBuffer, FileInfo[wParam].szDesc);
  321.          break;
  322.  
  323.       case SIM_GETFILENAME:
  324.          // wParam: File#, lpBuffer: to buffer.
  325.          lstrcpy(lpBuffer, FileInfo[wParam].szFileName);
  326.          break;
  327.  
  328.       case SIM_GETFILEDISK:
  329.          // wParam: File#, lpBuffer: to buffer 4 DESC. RETURNS #
  330.          dwResult = FileInfo[wParam].wDiskNum;
  331.          x = (WORD) SetupInfoSys(SIM_FINDDISKNUM, (WORD) dwResult, 0);
  332.          lstrcpy(lpBuffer, DiskInfo[x].szDesc);
  333.          break;
  334.  
  335.       case SIM_GETFILEDIR:
  336.          // wParam: File#, lpBuffer: to buffer. Returns #.
  337.          dwResult = FileInfo[wParam].wDirNum;
  338.          x = (WORD) SetupInfoSys(SIM_FINDDIRNUM, (WORD) dwResult, 0);
  339.          lstrcpy(lpBuffer, DirInfo[x].szDesc);
  340.          break;
  341.  
  342.       case SIM_ISFILECOMPRESSED:
  343.          // wParam: File#, lpBuffer: NU.
  344.          dwResult =  FileInfo[wParam].fCompressed;
  345.          break;
  346.  
  347.       case SIM_GETPMGROUP:
  348.          // wParam: NU, lpBuffer: buffer.
  349.          lstrcpy(lpBuffer, SetupInfo.szPMGroupName);
  350.          break;
  351.  
  352.       case SIM_GETPMGROUPFILENAME:
  353.          // wParam: NU, lpBuffer: buffer.
  354.          lstrcpy(lpBuffer, SetupInfo.szPMGroupFileName);
  355.          break;
  356.  
  357.       case SIM_GETNUMPMPROGS:
  358.          // wParam: NU, lpBuffer: NU.
  359.          dwResult = SetupInfo.wNumPMFiles;
  360.          break;
  361.  
  362.       case SIM_FINDDIRFORFILE:
  363.          // wParam: NU, lpBuffer: filename.
  364.          for (dwResult = 0; dwResult < SetupInfo.wNumFiles; dwResult++)
  365.             if (lstrcmpi(lpBuffer, FileInfo[(WORD) dwResult].szFileName) == 0)
  366.                break;
  367.          if (dwResult == SetupInfo.wNumFiles) dwResult = -1;
  368.          else {
  369.             dwResult =
  370.                SetupInfoSys(SIM_FINDDIRNUM, FileInfo[(WORD) dwResult].wDirNum, 0);
  371.          }
  372.          break;
  373.  
  374.       case SIM_GETPMPROGNAME:
  375.          // wParam: PMProg#, lpBuffer: buffer.
  376.          lstrcpy(lpBuffer, PMInfo[wParam].szFileName);
  377.          // Return directory index.
  378.          dwResult = SetupInfoSys(SIM_FINDDIRFORFILE, 0, lpBuffer);
  379.          break;
  380.  
  381.       case SIM_GETPMPROGDESC:
  382.          // wParam: PMProg#, lpBuffer: buffer.
  383.          lstrcpy(lpBuffer, PMInfo[wParam].szDesc);
  384.          break;
  385.  
  386.  
  387.       case SIM_GETPMICONINFO:
  388.          // wParam: PMProg#, lpBuffer: buffer. Returns icon #.
  389.          if (PMInfo[wParam].szIconFileName[0] == 0) {
  390.             lstrcpy(lpBuffer, PMInfo[wParam].szFileName);
  391.          } else {
  392.             lstrcpy(lpBuffer, PMInfo[wParam].szIconFileName);
  393.          }
  394.          dwResult = MAKELONG(
  395.             (WORD) SetupInfoSys(SIM_FINDDIRFORFILE, 0, lpBuffer), 
  396.             PMInfo[wParam].wIconPos);
  397.          break;
  398.  
  399.    }
  400.    return(dwResult);
  401. }
  402.